package com.yyb.service.impl;

import com.github.pagehelper.Page;
import com.yyb.common.PageInfo;
import com.yyb.domain.SysRole;
import com.yyb.domain.SysUser;
import com.yyb.dto.*;
import com.yyb.enums.StateEnums;
import com.yyb.exception.BusinessException;
import com.yyb.mapper.SysRoleMapper;
import com.yyb.service.SysRoleService;
import jakarta.annotation.Resource;
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 
 * 
 * 
 */
@Service
public class SysRoleServiceImpl extends BaseServiceImpl<SysRole> implements SysRoleService {

    @Resource
    private SysRoleMapper sysRoleMapper;

    /**
     * 分页查询角色
     *
     * @param pageInfo
     * @return
     */
    @Override
    public PageInfo<SysRole, SysRoleQueryDTO> getByPage(PageInfo<SysRole, SysRoleQueryDTO> pageInfo) {
        Page<SysRole> sysRolePage = this.startPage(pageInfo.getPageNumber(), pageInfo.getPageSize());
        List<SysRole> sysRoles=null;
        Integer userType = getCurrentUser().getUserType();
        if(userType.equals(StateEnums.USER_TYPE_ADMIN.getCode())){
            //说明是超级管理员，查询所有角色
            sysRoles=this.sysRoleMapper.queryAllRole(pageInfo.getParams());
        }else{
            //普通用户  只查询这个用户拥有的角色
            sysRoles=this.sysRoleMapper.queryAllRoleByUserId(pageInfo.getParams(),getCurrentUser().getUserId());
        }
        pageInfo.setTotalPage(sysRolePage.getPages());
        pageInfo.setTotalCount(sysRolePage.getTotal());
        pageInfo.setList(sysRoles);
        return pageInfo;
    }

    /**
     * 添加角色
     *
     * @param sysRoleAddDTO
     * @return
     */
    @Override
    public int insert(SysRoleAddDTO sysRoleAddDTO) {
        //创建被保存的对象
        SysRole sysRole=new SysRole();
        //copy
        BeanUtils.copyProperties(sysRoleAddDTO,sysRole);
        //填充其它属性
        Date date = new Date();
        sysRole.setCreateBy(getUsername());
        sysRole.setCreateTime(date);
        sysRole.setUpdateTime(date);
        return this.sysRoleMapper.insert(sysRole);
    }

    /**
     * 修改角色
     *
     * @param sysRoleUpdateDTO
     * @return
     */
    @Override
    public int updateByPrimaryKey(SysRoleUpdateDTO sysRoleUpdateDTO) {
        //创建被保存的对象
        SysRole sysRole=new SysRole();
        //copy
        BeanUtils.copyProperties(sysRoleUpdateDTO,sysRole);
        //填充其它属性
        Date date = new Date();
        sysRole.setUpdateBy(getUsername());
        sysRole.setUpdateTime(date);
        return this.sysRoleMapper.updateByPrimaryKeySelective(sysRole);
    }

    /**
     * 根据ID查询角色
     *
     * @param roleId
     * @return
     */
    @Override
    public SysRole selectByPrimaryKey(Long roleId) {
        return this.sysRoleMapper.selectByPrimaryKey(roleId);
    }

    /**
     * 删除角色
     * 删除sys_role里面的数据
     * 根据roleId删除sys_user_role里面数据
     * 根据roleId删除sys_role_menu里面的数据
     * @param roleId
     * @return
     */
    @Override
    @Transactional
    public int deleteByPrimaryKey(Long roleId) {
        //删除角色
        SysRole sysRole = this.sysRoleMapper.selectByPrimaryKey(roleId);
        if (ObjectUtils.isEmpty(sysRole)) {
            throw new BusinessException("角色不存在");
        }
        int row =this.sysRoleMapper.deleteByPrimaryKey(roleId);
        //根据roleId删除sys_user_role里面数据
        this.sysRoleMapper.deleteUserRoleByRoleId(roleId);
        //根据roleId删除sys_role_menu里面的数据
        this.sysRoleMapper.deleteRoleMenuByRoleId(roleId);
        return row;
    }

    /**
     * 根据角色ID查询当前角色拥有的权限菜单ID
     *
     * @param roleId
     * @return
     */
    @Override
    public List<Long> getCurrentRoleHasMenuIdsByRoleId(Long roleId) {
        List<Long> menuIds=this.sysRoleMapper.queryCurrentRoleHasMenuIdsByRoleId(roleId);
        return menuIds;
    }

    /**
     * 保存角色菜单之间的关系
     *
     * @param sysRoleMenuAddDTO
     * @return
     */
    @Override
    @Transactional
    public int saveRoleMenu(SysRoleMenuAddDTO sysRoleMenuAddDTO) {
        Long roleId = sysRoleMenuAddDTO.getRoleId();
        List<Long> menuIds = sysRoleMenuAddDTO.getMenuIds();
        //根据角色ID删除sys_role_menu里面的数据
        this.sysRoleMapper.deleteRoleMenuByRoleId(roleId);
        //保存
        if (!CollectionUtils.isEmpty(menuIds)) {
            this.sysRoleMapper.saveRoleMenu(roleId,menuIds);
        }
        return 1;
    }

    /**
     * 查询所有角色不分页
     *
     * @return
     */
    @Override
    public List<SysRole> getAllRoles() {
        SysUser currentUser = getCurrentUser();
        Integer userType = currentUser.getUserType();
        if(userType.equals(StateEnums.USER_TYPE_ADMIN.getCode())){
            //超级管理员查询所有角色
            return this.sysRoleMapper.queryAllRole(new SysRoleQueryDTO());
        }else {
            //普通用户，只能查询自己有的角色
            return this.sysRoleMapper.queryRolesByUserId(currentUser.getUserId());
        }
    }

    /**
     * 根据用户ID查询用户已拥有的角色IDS
     *
     * @param userId
     * @return
     */
    @Override
    public List<Long> getRoleIdsByUserId(Long userId) {
        List<SysRole> sysRoles = this.sysRoleMapper.queryAllRoleByUserId(new SysRoleQueryDTO(), userId);
        return sysRoles.stream().map(SysRole::getRoleId).collect(Collectors.toList());
    }

    /**
     * 保存用户和角色之间的关系
     *
     * @param sysRoleUserDTO
     * @return
     */
    @Override
    @Transactional
    public int saveUserRoles(SysRoleUserDTO sysRoleUserDTO) {
        Long userId = sysRoleUserDTO.getUserId();
        //根据用户ID删除用户拥有的所有角色
        this.sysRoleMapper.deleteUserRoleByUserId(userId);
        List<Long> roleIds = sysRoleUserDTO.getRoleIds();
        if (!CollectionUtils.isEmpty(roleIds)) {
            this.sysRoleMapper.saveUserRoles(userId,roleIds);
        }
        return 1;
    }
}
